Amazon Auroraで組み合わせ自由なエンドポイントが設定可能になりました
大栗です。
Amazon Auroraのエンドポイントにはクラスタエンドポイント、リーダーエンドポイント、インスタンスエンドポイントの3種類がありましたが、組み合わせを変更できるカスタムエンドポイントが利用可能になったのでレポートします。
- Announcement: Amazon Aurora Simplifies Workload Management with Custom Endpoints
- Using Custom Endpoints
カスタムエンドポイント
概要
Auroraは同じインスタンスでもフェイルオーバーなどでロールが変化するため、ロールごとにアクセスするためのエンドポイントがありました。
- クラスターエンドポイント: ロールがWriterのインスタンスへアクセスするエンドポイント
- 読み込みエンドポイント: ロールがReaderのインスタンスへアクセスするエンドポイント
- インスタンスエンドポイント: 特定のインスタンスへアクセスするエンドポイント
各々のエンドポイントを図示すると以下のようになります。
今回発表されたカスタムエンドポイントは、以下の様にインスタンスの組み合わせを自由に行えるエンドポイントとなっています。
何が嬉しいの?
例えば、Webシステムで同じデータをバッチ処理やBIでの参照を行うことを想定します。普通にAuroraでクラスターエンドポイントと読み込みエンドポイントを使用して構成すると、以下のようになります。
バッチやBIでは1回の処理で負荷の大きいクエリを流します。するとアクセスしたDBインスタンスのリソースが枯渇してしまい、他のワークロード(今回はWebアクセス)が読み込みエンドポイント経由でリソースが枯渇したDBインスタンスにアクセスしまうとスローダウンしてしまいます。カスタムエンドポイントはこのような場面で役に立ちます。
Reader2台をWebアクセス専用、1台をバッチ専用、2台をBI専用のカスタムエンドポイントをして以下のように登録します。するとワークロードによってDBインスタンスを使い分けられるので、Webリクエストのパフォーマンスも平準化でき重い処理を行うバッチやBIもDBインスタンスのリソースを使い切れます。
カスタムエンドポイントの仕様
カスタムエンドポイントの形式は以下になっており、カスタムエンドポイント名
の部分を最大63文字で設定できます。
<カスタムエンドポイント名>.cluster-custom-<カスタムDNS ID>.<DNSサフィックス>
カスタムエンドポイント名にはクラスター名を含まないため、クラスタ名を変更する場合にも変更が必要ありません。同一アカウント同一リージョンの別のクラスタに対して同じカスタムエンドポイント名は設定できません。カスタムエンドポイント固有の名称を設定します。
カスタムエンドポイントにはREADER
とANY
という2種類のタイプ(現時点ではマネージメントコンソールはANY
のみの模様)があります。READER
の場合はロールがReaderのインスタンスのみ(Writerインスタンスに名前解決されない)カスタムエンドポイントに設定できます。READER
の場合は、通常の読み込みエンドポイントと同様にWriter以外に対して名前解決されます。ANY
の場合はロールがWriter/Reader両方をカスタムエンドポイントに設定できます。タイプがANY
の場合WriterとReaderを区別せず同確率で負荷分散し書き込み可能か事前に判断できないため、読み込み専用として使用してください。
新規に作成するDBインスタンスをカスタムエンドポイントに含める設定が可能であるため、Auroraのオートスケーリングで増えたDBインスタンスも自動的にカスタムエンドポイントに含めることができます。特定のインスタンスを除外することができるため、追加するDBインスタンスをカスタムエンドポイントに追加しない事も可能です。
やってみた
ここでは初期状態で以下のWriterを1台、Readerを3台の環境で検証を行います。
- mysql56-1.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com: Writer
- mysql56-1-ap-northeast-1a.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com: Reader
- mysql56-1-ap-northeast-1c.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com: Reader
- mysql56-1-ap-northeast-1d.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com: Reader
各々のIPアドレスは以下になっているとします。
$ dig +noall +ans \ > mysql56-1.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com \ > mysql56-1-ap-northeast-1a.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com \ > mysql56-1-ap-northeast-1c.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com \ > mysql56-1-ap-northeast-1d.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com mysql56-1.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com. 5 IN A 172.31.35.49 mysql56-1-ap-northeast-1a.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com. 5 IN A 172.31.6.223 mysql56-1-ap-northeast-1c.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com. 5 IN A 172.31.17.127 mysql56-1-ap-northeast-1d.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com. 5 IN A 172.31.36.111
マネージメントコンソールでの操作
マネージメントコンソールでクラスターの画面を開き対象のクラスタを選択します。
クラスターの詳細画面の中ほどにエンドポイント
という項が増えています。ここのカスタムエンドポイントの作成
をクリックします。
ここでは以下の内容でカスタムエンドポイントの設定を行います。入力後にCreate endpoint
をクリックします。
項目 | 値 | 備考 |
---|---|---|
Endpoint name | test1 | |
Endpoint members | mysql56-1, mysql56-1-ap-northeast-1a, mysql56-1-ap-northeast-1c | |
Attach future instances added to this cluster | チェック | 新規に起動したDBインスタンスも対象になる |
カスタムエンドポイントが作成完了するまで少し待ちます。
作成したカスタムエンドポイントの名前解決をVPC内で行ってみます。すると設定したmysql56-1
、mysql56-1-ap-northeast-1a
、mysql56-1-ap-northeast-1c
に解決されることが分かります。
$ dig +noall +ans test1.cluster-custom-a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com test1.cluster-custom-a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com. 1 IN CNAME mysql56-1.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com. mysql56-1.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com. 5 IN A 172.31.35.49 $ dig +noall +ans test1.cluster-custom-a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com test1.cluster-custom-a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com. 1 IN CNAME mysql56-1-ap-northeast-1c.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com. mysql56-1-ap-northeast-1c.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com. 5 IN A 172.31.17.127 $ dig +noall +ans test1.cluster-custom-a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com test1.cluster-custom-a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com. 1 IN CNAME mysql56-1-ap-northeast-1a.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com. mysql56-1-ap-northeast-1a.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com. 5 IN A 172.31.6.223
実際にアクセスしてみます。innodb_read_only変数がONなのでReaderにアクセスしたようです。
$ mysql -u awsuser -pmypassword -h test1.cluster-custom-a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 9 Server version: 5.6.10-log MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]> show variables like 'innodb_read_only'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | innodb_read_only | ON | +------------------+-------+ 1 row in set (0.00 sec)
何度かアクセスするとWriterのインスタンスにアクセスすることもあります。
$ mysql -u awsuser -pmypassword -h test1.cluster-custom-a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 13 Server version: 5.6.10-log MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]> show variables like 'innodb_read_only'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | innodb_read_only | OFF | +------------------+-------+ 1 row in set (0.00 sec)
ここでリードレプリカを追加してみます。インスタンスIDをmysql56-2
とします。
カスタムエンドポイントを確認すると追加したmysql56-2
が自動で設定されています。これはAttach future instances added to this cluster
にチェックを入れていたため、追加されたDBインスタンスもカスタムエンドポイントの対象になるためです。
AWS CLIでの操作
次はAWS CLIで設定してみます。
タイプをREADER
として設定してみます。
$ aws rds create-db-cluster-endpoint --db-cluster-identifier my56 \ > --db-cluster-endpoint-identifier test2 \ > --endpoint-type READER \ > --static-members mysql56-1-ap-northeast-1a mysql56-1-ap-northeast-1c mysql56-1-ap-northeast-1d { "Status": "creating", "Endpoint": "test2.cluster-custom-a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com", "DBClusterIdentifier": "my56", "CustomEndpointType": "READER", "StaticMembers": [ "mysql56-1-ap-northeast-1a", "mysql56-1-ap-northeast-1c", "mysql56-1-ap-northeast-1d" ], "EndpointType": "CUSTOM", "DBClusterEndpointResourceIdentifier": "cluster-endpoint-A1B2C3D4E5F6G7I8H9J0K1L2M3", "ExcludedMembers": [], "DBClusterEndpointIdentifier": "test2", "DBClusterEndpointArn": "arn:aws:rds:ap-northeast-1:123456789012:cluster-endpoint:test2" }
作成したエンドポイントを確認してみるとREADER
として作成されています。
$ aws rds describe-db-cluster-endpoints --db-cluster-endpoint-identifier test2 { "DBClusterEndpoints": [ { "Status": "creating", "Endpoint": "test2.cluster-custom-a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com", "DBClusterIdentifier": "my56", "CustomEndpointType": "READER", "StaticMembers": [ "mysql56-1-ap-northeast-1a", "mysql56-1-ap-northeast-1c", "mysql56-1-ap-northeast-1d" ], "EndpointType": "CUSTOM", "DBClusterEndpointResourceIdentifier": "cluster-endpoint-A1B2C3D4E5F6G7I8H9J0K1L2M3", "ExcludedMembers": [], "DBClusterEndpointIdentifier": "test2", "DBClusterEndpointArn": "arn:aws:rds:ap-northeast-1:123456789012:cluster-endpoint:test2" } ] }
次にREADER
ですがWriterノードを追加してみます。
$ aws rds modify-db-cluster-endpoint \ > --db-cluster-endpoint-identifier test2 \ > --static-members mysql56-1 mysql56-1-ap-northeast-1a mysql56-1-ap-northeast-1c mysql56-1-ap-northeast-1d { "Status": "modifying", "Endpoint": "test2.cluster-custom-a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com", "DBClusterIdentifier": "my56", "CustomEndpointType": "READER", "StaticMembers": [ "mysql56-1", "mysql56-1-ap-northeast-1a", "mysql56-1-ap-northeast-1c", "mysql56-1-ap-northeast-1d" ], "EndpointType": "CUSTOM", "DBClusterEndpointResourceIdentifier": "cluster-endpoint-A1B2C3D4E5F6G7I8H9J0K1L2M3", "ExcludedMembers": [], "DBClusterEndpointIdentifier": "test2", "DBClusterEndpointArn": "arn:aws:rds:ap-northeast-1:123456789012:cluster-endpoint:test2" }
この状態でコンソールでエンドポイントを確認します。するとWriterであるmysql56-1
が一覧にありません。READERに設定しているためWriterインスタンスに名前解決していないようです。
ここでmysql56-1
フェイルオーバーさせてmysql56-1-ap-northeast-1a
がWriterになった状態でカスタムエンドポイントを確認してみます。
今度はReaderになったmysql56-1
が表示されて、Writerになったはmysql56-1-ap-northeast-1a
が表示されなくなりました。
さいごに
今までワークロードごとにアクセスするDBインスタンスを分けるためには、自前でロードバランシング機構を組んだり、個別のインスタンスエンドポイントに直接アクセスする必要がありました。カスタムエンドポイントによって簡単に設定できるようになりました。読み込み専用DBに限定されますが、インスタンスでワークロード管理ができ処理ごとにリソースを使い切れる様になったのが重要だと思います。